/*
  Programa GEFE - Gestión de eventos lúdicos.
  Copyright (C) 2010  Antonio Ramírez Marti

  This program is free software: you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation, either version 3 of the License, or
  (at your option) any later version.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#include "acolitobebidas.h"
#include "ui_acolitobebidas.h"

#include <QTableWidgetItem>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QDebug>
#include <QStringList>
#include <QDateTime>
#include <QVariant>
#include <QVariantList>


AcolitoBebidas::AcolitoBebidas(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::AcolitoBebidas)
{
    ui->setupUi(this);
    setup();
}

AcolitoBebidas::~AcolitoBebidas()
{
    limpiaBotonesProductos();
    limpiaVenta();
    delete ui;
}

void AcolitoBebidas::changeEvent(QEvent *e)
{
    QWidget::changeEvent(e);
    switch (e->type()) {
    case QEvent::LanguageChange:
        ui->retranslateUi(this);
        break;
    default:
        break;
    }
}

void AcolitoBebidas::setup()
{
    layoutBotones=0;
    ui->vistaVenta->setColumnCount(3);
    connect(this,SIGNAL(nuevoTotal(double)),ui->lcdTotal,SLOT(display(double)));
    setConectado(false);
    this->botonesModo= new QButtonGroup(this);
    botonesModo->addButton(ui->asistenteButton,Asistente);
    botonesModo->addButton(ui->organizadorButton,Organizador);

    connect(botonesModo,SIGNAL(buttonClicked(int)),this,SLOT(setModo(int)));
    connect(botonesModo,SIGNAL(buttonClicked(int)),this,SLOT(calculaTotal(int)));
    ui->asistenteButton->click();
    connect(ui->efectivoSpinBox,SIGNAL(valueChanged(double)),this,SLOT(calculaCambio(double)));

    connect(ui->ventaButton,SIGNAL(clicked()),this,SLOT(guardaVenta()));
    connect(ui->cancelaButton,SIGNAL(clicked()),this,SLOT(limpiaVenta()));

}

bool AcolitoBebidas::isConectado() const
{
    return this->estadoConexion;
}

void AcolitoBebidas::setConectado(bool estado)
{
    switch(estado)
    {
    case true:          ///< Conectar el acolito
        this->generaBotonesProductos();
        this->limpiaVenta();
        break;
    case false:
        this->limpiaVenta();
        this->limpiaBotonesProductos();
        break;
    default:
        break;
    }
    estadoConexion=estado;
}

void AcolitoBebidas::limpiaBotonesProductos()
{
    //Limpiar la lista
    BotonProducto *boton;

    foreach(boton,this->listaProductos)
    {
        boton->disconnect();
        delete boton;
    }

    listaProductos.clear();
    delete this->layoutBotones;
    layoutBotones=0;
}

void AcolitoBebidas::generaBotonesProductos()
{
    this->limpiaBotonesProductos();

    BotonProducto *nuevoBoton;

    {
        QSqlQuery query(QSqlDatabase::database("evento"));

        query.exec("SELECT nombre,precioVenta,precioOrg FROM producto");

        while(query.next())
        {
            nuevoBoton=new BotonProducto(this);
            nuevoBoton->setText(query.value(0).toString());
            nuevoBoton->setPrecioVenta(query.value(1).toDouble());
            nuevoBoton->setPrecioOrg(query.value(2).toDouble());
            connect(nuevoBoton,SIGNAL(productoSolicitado(QString,double,double)),this,SLOT(addProductoVenta(QString,double,double)));
            listaProductos.append(nuevoBoton);
        }
    }

    mostrarBotonesProductos();

}

void AcolitoBebidas::addProductoVenta(QString n, double pVenta, double pOrg)
{
    QStringList cabecera;

    cabecera << "Producto" << "Precio estandar" << "Precio organizador";
    QTableWidgetItem *item;

    ui->vistaVenta->insertRow(0);
    item=new QTableWidgetItem(n);
    item->setData(Qt::DisplayRole,n);
    ui->vistaVenta->setItem(0,0,item);

    item=new QTableWidgetItem(QString::number(pVenta));
    item->setData(Qt::UserRole,pVenta);
    item->setData(Qt::DisplayRole,QString::number(pVenta));
    ui->vistaVenta->setItem(0,1,item);

    item=new QTableWidgetItem(QString::number(pOrg));
    item->setData(Qt::UserRole,pOrg);
    item->setData(Qt::DisplayRole,QString::number(pOrg));
    ui->vistaVenta->setItem(0,2,item);

    ui->vistaVenta->setHorizontalHeaderLabels(cabecera);
    ui->vistaVenta->resizeColumnsToContents();
    ui->efectivoSpinBox->setValue(0.00);
    ui->lcdCambio->display(0);

    calculaTotal(this->mod);
}

void AcolitoBebidas::mostrarBotonesProductos()
{
    BotonProducto *boton;
    int numFilas=0;
    int numColumnas=0;
    int maxColumnas=5;
    if(this->layoutBotones)
    {
        delete layoutBotones;
        layoutBotones=0;
    }

    layoutBotones=new QGridLayout(ui->productosGroupBox);

    foreach(boton,listaProductos)
    {
        layoutBotones->addWidget(boton,numFilas,numColumnas++);
        if(numColumnas==maxColumnas)
        {
            numColumnas=0;
            numFilas++;
        }
    }
}

void AcolitoBebidas::limpiaVenta()
{
    QTableWidgetItem *item;
    ui->vistaVenta->clear();
    int numRows=ui->vistaVenta->rowCount();
    for(int i=0;i<ui->vistaVenta->rowCount();i++)
    {
        for(int j=0;j<ui->vistaVenta->columnCount();j++)
        {
            item=ui->vistaVenta->takeItem(i,j);
            delete item;
        }
    }

    for(int i=0;i<numRows;i++)
        ui->vistaVenta->removeRow(0);

    ui->efectivoSpinBox->setValue(0.00);
    calculaTotal(this->mod);
    ui->lcdCambio->display(0);
}

void AcolitoBebidas::calculaTotal(int modo)
{
    double total=0;
    int precio;
    switch(modo)
    {
    case Asistente:
        precio=1;
        break;
    case Organizador:
        precio=2;
        break;
    default:
        precio=0;
        break;
    }

    for(int i=0;i<ui->vistaVenta->rowCount();i++)
        total+=ui->vistaVenta->item(i,precio)->data(Qt::UserRole).toDouble();

    emit nuevoTotal(total);
}

void AcolitoBebidas::setModo(int modo)
{
    mod=(ModoVenta)modo;
    calculaTotal(mod);
    calculaCambio(ui->efectivoSpinBox->value());
}


void AcolitoBebidas::guardaVenta()
{
    QVariantList nombres,precios,marcas,modo;
    int p;
    QString m;
    switch(mod)
    {
    case Asistente:
        p=1;
        m="Asistente";
        break;
    case Organizador:
        p=2;
        m="Organizador";
        break;
    default:
        p=0;
        m=QString();
        break;
    }

    for(int i=0;i<ui->vistaVenta->rowCount();i++)
    {
        nombres << ui->vistaVenta->item(i,0)->data(Qt::DisplayRole).toString();
        precios << ui->vistaVenta->item(i,p)->data(Qt::UserRole).toDouble();
        marcas << QDateTime::currentDateTime().toString("dd.MM.yyyy hh:mm:ss ap");
        modo << m;
    }

    {
        QSqlQuery query(QSqlDatabase::database("evento"));

        query.prepare("INSERT INTO ventas(nombre,precioVenta,tipoVenta,timestamp)"
                      "VALUES(?,?,?,?)");

        query.addBindValue(nombres);
        query.addBindValue(precios);
        query.addBindValue(modo);
        query.addBindValue(marcas);

        query.execBatch();
    }
    this->limpiaVenta();
}

void AcolitoBebidas::calculaCambio(double efectivo)
{
    if(efectivo)
    {
     double valorTotal=ui->lcdTotal->value();
     double cambio;

     cambio=efectivo-valorTotal;

     ui->lcdCambio->display(cambio);
    }
    else ui->lcdCambio->display(0);
}

void AcolitoBebidas::abrirDialogoPales()
{
    dialogoPales *dialogo= new dialogoPales(this);

    dialogo->exec();
    delete dialogo;
}

void AcolitoBebidas::nuevosProductos()
{
    addProductosDialog *dialogo = new addProductosDialog(this);
    connect(dialogo,SIGNAL(cambiosEnProductos()),this,SLOT(generaBotonesProductos()));

    dialogo->exec();
    delete dialogo;
    this->generaBotonesProductos();
}
